//三.基于下面提供的代码，完成后续的四个练习

//support.js
class Container {
    static of(value) {
        return new Container(value)
    }
    constructor(value) {
        this._value = value
    }
    map(fn) {
        return Container.of(fn(this._value))
    }
}

class Maybe {
    static of(x) {
        return new Maybe(x)
    }
    isNothing() {
        return this._value === null || this._value === undefined
    }
    constructor(x) {
        this._value = x
    }
    map(fn) {
        return this.isNothing() ? this : Maybe.of(fn(this._value))
    }
}
module.exports = {Maybe, Container}
//练习1：使用fp.add(x,y)和fp.map(f,x)创建一个能让functor里的值增加的函数ex1
//app.js
const fp = require('lodash/fp')
// const { Maybe, Container } = require('./support')
let maybe = Maybe.of([5, 6, 1])
let ex1 = (number) => {
    //你需要实现的函数
    return  maybe.map(fp.map(fp.add(number)))
}

//练习2.实现一个函数ex2，能够使用fp.first获取列表的第一个元素
//app.js
let xs = Container.of(['do', 'ray', 'me', 'fa', 'so', 'la', 'ti', 'do'])
let ex2 = () => {
    //你需要实现的函数
    return xs.map(fp.first)
}

//练习3.实现一个函数ex3，使用safeProp和fp.first找到user的名字的首字母
//app.js
let safeProp = fp.curry(function (x, o) {
    return Maybe.of(o[x])
})
let user = {id:2,name:'Albert'}
let ex3 = () => {
    //你需要实现的函数
    return safeProp('name')(obj).map(fp.first)
}

//练习4: 使用Maybe重写ex4，不要有if语句
//qpp.js
let ex4 = function (n) {
    if(n) {
        return parseInt(n)
    }
}

//重写
let ex4 = function(n){
    let maybe = Maybe.of(n)
    return maybe.map(parseInt)
}